iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0
自我挑戰組

設計模式系列 第 8

Day8 - 適配器模式(Adapter pattern)

  • 分享至 

  • xImage
  •  

介紹
適配器模式用來將一介面轉變為另一個介面。

適配器模式在legacy code與新code結合的過程有不錯的效果。Legacy code因存在時間長,已有大量用戶使用,更變介面會使所有使用此介面的程式都需要修改。此時可在legacy code介面再"套上"一層新介面(適配器模式),新code可用此新介面來實現新功能,而使用legacy code原介面的程式則不受影響。

可把適配器模式想像成多國轉換插座,各國的插座孔及電壓都不同,旅行時透過多國轉換插座將插座轉換我們電子產品可用的模式。

#include <iostream>

// 抽象轉換器
class Adapter
{
public:
    virtual void Show() = 0;
    virtual ~Adapter() {}
};

// 外星人插座
class AlienPlug
{
public:
    void ShowType()
    {
        std::cout << "Alien type: 100 holes, 999 Volt" << std::endl;
    }
};

// 將TW插座轉換成外星人插座的轉換器
class TWAdapter : public Adapter
{
public:
    TWAdapter(AlienPlug &p) : m_pPlug(p) {}

    virtual void Show() override
    {
        std::cout << "You are using TW adapter to alien plug" << std::endl;

        // Do some convert tasks
        //...

        m_pPlug.ShowType();
    }

private:
    AlienPlug &m_pPlug;
};

// 將US插座轉換成外星人插座的轉換器
class USAdapter : public Adapter
{
public:
    USAdapter(AlienPlug &p) : m_pPlug(p) {}

    virtual void Show() override
    {
        std::cout << "You are using US adapter to alien plug" << std::endl;

        // Do some convert tasks
        //...

        m_pPlug.ShowType();
    }

private:
    AlienPlug &m_pPlug;
};

int main()
{
    // 外星人插座
    AlienPlug alienPlug;

    // 插上TW轉換插座
    TWAdapter twPlug(alienPlug);
    twPlug.Show();

    // 插上US轉換插座
    USAdapter usPlug(alienPlug);
    usPlug.Show();

    return 0;
}

Output:

You are using TW adapter to alien plug
Alien type: 100 holes, 999 Volt
You are using US adapter to alien plug
Alien type: 100 holes, 999 Volt

上一篇
Day7 - 建造模式(Builder pattern)
下一篇
Day9 - 橋接模式(Bridge pattern)
系列文
設計模式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言